# 缓存位置
从缓存位置上来说分为四种,并且各自有优先级,当依次查找缓存且都没有命中的时候,才会去请求网络。
- Service Worker
- Memory Cache
- Disk Cache
- Push Cache
- Service Worker
Service Worker 是运行在浏览器背后的独立 Worker 线程,一般可以用来实现缓存功能。使用 Service Worker的话,传输协议必须为 HTTPS。因为 Service Worker 中涉及到请求拦截,所以必须使用 HTTPS 协议来保障安全。Service Worker 的缓存与浏览器其他内建的缓存机制不同,它可以让我们自由控制缓存哪些文件、如何匹配缓存、如何读取缓存,并且缓存是持续性的。
- https://www.zhangxinxu.com/wordpress/2017/07/service-worker-cachestorage-offline-develop/
Memory Cache 内存缓存是一种比较特殊的缓存,他不受max-age、no-cache等配置的影响,即使我们不设置缓存,如果当前的内存空间比较充裕的话,一些资源还是会被缓存下来。但这种缓存是暂时的,一旦关闭了浏览器,这一部分用于缓存的内存空间就会被释放掉。如果真的不想使用缓存,可以设置 Cache-Control: no-store,这样,即便是内存缓存,也不会生效。 (注意:这部分内存空间在浏览器关闭时才会释放,仅关闭tab不会释放,所以关闭‘baidu.com’的tab,在另一个tab再打开‘baidu.com’依然会从加载缓存) 内存缓存虽然比较高效,但还是受限于计算机内存的大小,所以能让我们使用的内存并不多,这个时候就需要硬盘来存储大量的缓存。
Disk Cache Disk Cache 也就是存储在硬盘中的缓存。相比较内存缓存的优势就是长时效。 它会根据HTTP Header中设置的字段类型,来判断资源是否需要重新请求。 如果当前内存使用率高的话,请求资源大概率会被缓存到disk cache。
# DNS 缓存
浏览器缓存通常是指 HTTP 缓存,在讲 HTTp 缓存前,先来了解下浏览器中可能存在的另外一种缓存 DNS 缓存。
DNS (Domain Name System),即域名系统。
DNS 解析作用:域名 ——> IP
DNS 解析过程:
- 查询浏览器 DNS 缓存
- 查询系统 host 中是否有域名-IP映射
- 查询本地(通常是网络服务商)DNS 服务器
- 查询根 DNS 服务器
# HTTP 缓存
HTTP缓存机制详见这篇文章 (opens new window)
这里重点要讨论的是 HTTP 缓存在浏览器中的存储机制,先看一张浏览器缓存的流程图:
第一次请求资源:
- 总是优先查询缓存,无缓存才会向服务器请求资源;
- 获取响应后根据对应策略缓存资源,此时会涉及资源存储位置问题:
- 头字段要求缓存(强缓存或协商缓存)的资源,会被存入硬盘中(Disk Cache)
- 头字段未要求缓存的资源、头字段要求缓存且体积比较小、浏览器认为会频繁使用的资源,会被存入内存中(Memory Cache)
也就是说,被存入内存中的资源,如果也是要求缓存的资源,那么它也会被存入硬盘中。我们可以验证这个结论:
打开一个页面,查看资源请求,所有资源都是从服务端获得
F5 刷新页面,有些资源从内存中获取,可见步骤1中,资源缓存入了内存中
关闭浏览器(此时内存中的缓存会被清除),重新打开该页面,发现之前内存中的资源从硬盘中获取
可见我们的结论是正确的。
# 用户行为对浏览器缓存的影响
所谓用户行为对浏览器缓存的影响,指的就是用户在浏览器如何操作时,会触发怎样的缓存策略。主要有 3 种:
- 打开网页,地址栏输入地址: 查找 disk cache 中是否有匹配。如有则使用;如没有则发送网络请求。
- 普通刷新 (F5):因为 TAB 并没有关闭,因此 memory cache 是可用的,会被优先使用(如果匹配的话),其次才是 disk cache。
- 强制刷新 (Ctrl + F5):浏览器不使用缓存,因此发送的请求头部均带有 Cache-control: no-cache(为了兼容,还带了 Pragma: no-cache),服务器直接返回 200 和最新内容。